home *** CD-ROM | disk | FTP | other *** search
- package Win32::NetResource;
-
- require Exporter;
- require DynaLoader;
- require AutoLoader;
-
- @ISA = qw(Exporter DynaLoader);
- # Items to export into callers namespace by default. Note: do not export
- # names by default without a very good reason. Use EXPORT_OK instead.
- # Do not simply export all your public functions/methods/constants.
- @EXPORT = qw(
- RESOURCEDISPLAYTYPE_DOMAIN
- RESOURCEDISPLAYTYPE_FILE
- RESOURCEDISPLAYTYPE_GENERIC
- RESOURCEDISPLAYTYPE_GROUP
- RESOURCEDISPLAYTYPE_SERVER
- RESOURCEDISPLAYTYPE_SHARE
- RESOURCEDISPLAYTYPE_TREE
- RESOURCETYPE_ANY
- RESOURCETYPE_DISK
- RESOURCETYPE_PRINT
- RESOURCETYPE_UNKNOWN
- RESOURCEUSAGE_CONNECTABLE
- RESOURCEUSAGE_CONTAINER
- RESOURCEUSAGE_RESERVED
- RESOURCE_CONNECTED
- RESOURCE_GLOBALNET
- RESOURCE_REMEMBERED
- );
-
- =head1 NAME
-
- Win32::NetResource - manage network resources in perl
-
- =head1 SYNOPSIS
-
- use Win32::NetResource;
-
- $ShareInfo = {
- 'path' => "C:\\MyShareDir",
- 'netname' => "MyShare",
- 'remark' => "It is good to share",
- 'passwd' => "",
- 'current-users' =>0,
- 'permissions' => 0,
- 'maxusers' => -1,
- 'type' => 0,
- };
-
- Win32::NetResource::NetShareAdd( $ShareInfo,$parm )|| die "unable to add share\n";
-
-
- =head1 DESCRIPTION
-
- This module offers control over the network resources of Win32.Disks,
- printers etc can be shared over a network.
-
- =head1 DATA TYPES
- There are two main data types required to control network resources.
- In Perl these are represented by hash types.
-
- =over 10
- =item %NETRESOURCE
-
- KEY VALUE
- 'Scope' => Scope of an Enumeration
- RESOURCE_CONNECTED,
- RESOURCE_GLOBALNET,
- RESOURCE_REMEMBERED.
-
- 'Type' => The type of resource to Enum
- RESOURCETYPE_ANY All resources
- RESOURCETYPE_DISK Disk resources
- RESOURCETYPE_PRINT Print resources
-
- 'DisplayType' => The way the resource should be displayed.
- RESOURCEDISPLAYTYPE_DOMAIN
- The object should be displayed as a domain.
- RESOURCEDISPLAYTYPE_GENERIC
- The method used to display the object does not matter.
- RESOURCEDISPLAYTYPE_SERVER
- The object should be displayed as a server.
- RESOURCEDISPLAYTYPE_SHARE
- The object should be displayed as a sharepoint.
-
- 'Usage' => Specifies the Resources usage:
- RESOURCEUSAGE_CONNECTABLE
- RESOURCEUSAGE_CONTAINER.
-
- 'LocalName' => Name of the local device the resource is
- connected to.
-
- 'RemoteName' => The network name of the resource.
- 'Comment' => A string comment.
- 'Provider' => Name of the provider of the resource.
-
- =back
- =item %SHARE_INFO
-
- This hash represents the SHARE_INFO_502 struct.
- =over 10
- KEY VALUE
- 'netname' => Name of the share.
- 'type' => type of share.
- 'remark' => A string comment.
- 'permissions' => Permissions value
- 'maxusers' => the max # of users.
- 'current-users' => the current # of users.
- 'path' => The path of the share.
- 'passwd' => A password if one is req'd
-
- =back
- =head1 FUNCTIONS
-
- =head2 NOTE:
- all of the functions return FALSE (0) if they fail.
-
- =over 10
-
- =item GetSharedResources(\@Resources,dwType)
- Creates a list in @Resources of %NETRESOURCE hash references.
-
- =item AddConnection(\%NETRESOURCE,$Password,$UserName,$Connection)
- Makes a connection to a network resource specified by %NETRESOURCE
-
- =item CancelConnection($Name,$Connection,$Force)
- Cancels a connection to a network resource connected to local device
- $name.$Connection is either 1 - persistent connection or 0, non-persistent.
-
- =item WNetGetLastError($ErrorCode,$Description,$Name)
- Gets the Extended Network Error.
-
- =item GetError( $ErrorCode )
- Gets the last Error for a Win32::NetResource call.
-
- =item GetUNCName( $UNCName, $LocalPath );
- returns the UNC name of the disk share connected to $LocalPath in $UNCName.
-
- =head2 servername is optional for all the calls below. ( if not given the local machine is assumed. )
-
- =item NetShareAdd(\%SHARE,$parm_err,$servername = NULL )
- Add a share for sharing.
-
- =item NetShareCheck($device,$type,$servername = NULL )
- Check if a share is available for connection.
-
- =item NetShareDel( $netname, $servername = NULL )
- Remove a share from a machines list of shares.
-
- =item NetShareGetInfo( $netname, \%SHARE,$servername=NULL )
- Get the %SHARE_INFO information about the share $netname on the server $servername.
-
- =item NetShareSetInfo( $netname,\%SHARE,$parm_err,$servername=NULL)
- Set the information for share $netname.
-
- =back
-
- =cut
-
- sub AUTOLOAD {
- # This AUTOLOAD is used to 'autoload' constants from the constant()
- # XS function. If a constant is not found then control is passed
- # to the AUTOLOAD in AutoLoader.
-
- local($constname);
- ($constname = $AUTOLOAD) =~ s/.*:://;
- $val = constant($constname, @_ ? $_[0] : 0);
- if ($! != 0) {
- if ($! =~ /Invalid/) {
- $AutoLoader::AUTOLOAD = $AUTOLOAD;
- goto &AutoLoader::AUTOLOAD;
- }
- else {
- ($pack,$file,$line) = caller;
- die "Your vendor has not defined Win32::File macro $constname, used at $file line $line.
- ";
- }
- }
- eval "sub $AUTOLOAD { $val }";
- goto &$AUTOLOAD;
- }
-
- sub AddConnection
- {
- local $NetResource = _hash2NET( $_[0] );
-
- _AddConnection($NetResource,$_[1],$_[2],$_[3]);
- }
-
-
-
- sub GetSharedResources
- {
- ( ref $_[0] == ARRAY )||
- die "GetSharedResources: ARRAY reference required\n";
-
- local $Aref = [];
- local $Href;
- local $Ret;
-
- # Get the shared resources.
-
- $Ret = _GetSharedResources( $Aref ,$_[1] );
-
- #build the array of hashes in $_[0]
-
- foreach ( @$Aref ){
- $Href = _NET2hash( $_ );
- push( @{$_[0]}, $Href );
- }
-
- $Ret;
- }
-
- sub NetShareAdd
- {
- local $ShareInfo;
- $ShareInfo = _hash2SHARE( $_[0] );
- _NetShareAdd($ShareInfo,$_[1],$_[2]);
-
- }
-
- sub NetShareGetInfo
- {
- local $NetInfo,$Val;
- $Val = _NetShareGetInfo( $_[0],$NetInfo,$_[2]);
-
- $_[1] = _SHARE2hash( $NetInfo );
-
- $Val;
- }
-
- sub NetShareSetInfo
- {
- local $ShareInfo;
- $ShareInfo = _hash2SHARE( $_[3] );
-
- _NetShareSetInfo( $_[0],$_[1],$_[2],$ShareInfo,$_[4]);
-
- }
-
-
- #These are private functions to work with the ShareInfo structure.
- #please note that the implementation of these calls requires the SHARE_INFO_502 level
- #of information.
-
- sub _SHARE2hash
- {
- my $ShareRef = $_[0];
-
- local $netname,$type,$remark,$permissions,$maxusers;
- local $current_users,$path,$passwd;
-
- ($type,$permissions,$maxuses,$current_users,$remark,$netname,$path,$passwd)=
- unpack('i4 A257 A81 A257 A257',$ShareRef);
-
- $Hash={ 'netname' => $netname,
- 'type' => $type,
- 'remark' => $remark,
- 'permissions' => $permissions,
- 'maxusers' => $maxuses,
- 'current-users' => $current_users,
- 'path' => $path,
- 'passwd' => $passwd,
- };
-
- $Hash;
-
-
- }
-
- sub _hash2SHARE
- {
- local $Hash = $_[0];
- local $ShareRef;
-
- ( ref $Hash == HASH )||
- die "reference passed is not a hash reference\n";
-
-
- local $netname,$type,$remark,$permissions,$maxusers;
- local $current_users,$path,$passwd;
-
- $netname = $Hash->{'netname'} . "\0";
- $type = $Hash->{'type'} . "\0";
- $remark = $Hash->{'remark'} . "\0";
- $permissions= $Hash->{'permissions'} . "\0";
- $maxusers = $Hash->{'maxusers'} . "\0";
- $current_users= $Hash->{'current_users'} . "\0";
- $path = $Hash->{'path'} . "\0";
- $passwd = $Hash->{'passwd'} . "\0";
-
- $ShareRef = pack( 'i4 A257 A81 A257 A257',$type,$permissions,$maxusers,$current_users,$remark,$netname,$path,$passwd);
-
- $ShareRef;
- }
-
- #These are private functions to translate the NETRESOURCE structure to a hash
- # for manipulation in perl.
- #typedef struct _NETRESOURCE { // nr
- # DWORD dwScope;
- # DWORD dwType;
- # DWORD dwDisplayType;
- # DWORD dwUsage;
- # LPTSTR lpLocalName;
- # LPTSTR lpRemoteName;
- # LPTSTR lpComment;
- # LPTSTR lpProvider;
- #} NETRESOURCE;
-
- sub _NET2hash
- {
- my $netref = $_[0];
- local $Scope,$Type,$DisplayType,$Usage,$LocalName,$RemoteName,$Comment,$Provider;
-
- ($Scope,$Type,$DisplayType,$Usage,$LocalName,$RemoteName,$Comment,$Provider) =
- unpack( "i4 p4", $netref );
-
-
- $Hash = {
- 'Scope' => $Scope,
- 'Type' => $Type,
- 'DisplayType' => $DisplayType,
- 'Usage' => $Usage,
- 'LocalName' => $LocalName,
- 'RemoteName' => $RemoteName,
- 'Comment' => $Comment,
- 'Provider' => $Provider,
- };
-
- $Hash;
- }
-
- sub _hash2NET
- {
- my $hashref = $_[0];
- ( ref $hashref == HASH )|| die "Hash reference required\n";
- local $Scope,$Type,$DisplayType,$Usage,$LocalName,$RemoteName,$Comment,$Provider;
-
- $Scope = $hashref->{'Scope'};
- $Type = $hashref->{'Type'};
- $DisplayType = $hashref->{'DisplayType'};
- $Usage = $hashref->{'Usage'};
- $LocalName = $hashref->{'LocalName'};
- $RemoteName = $hashref->{'RemoteName'};
- $Comment = $hashref->{'Comment'};
- $Provider = $hashref->{'Provider'};
-
- $hashref = pack( 'i4 p4',$Scope,$Type,$DisplayType,$Usage,$LocalName,$RemoteName,$Comment,$Provider);
-
- $hashref;
-
- }
-
-
- bootstrap Win32::NetResource;
-
- # Preloaded methods go here.
-
- # Autoload methods go after __END__, and are processed by the autosplit program.
-
- 1;
- __END__
-